package br.uniceub.fsw.talentos.dao;

import br.uniceub.fsw.arquitetura.persistencia.dao.BaseDAO;
import br.uniceub.fsw.arquitetura.persistencia.dao.ConstrutorSQL;
import br.uniceub.fsw.talentos.vo.GrupoTrabalhoVO;
import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/** 
 * Data Access Object da entidade TB_GrupoTrabalho. Essa classe é responsável por todas as 
 * operações de banco de dados relacionadas à entidade.* 
 *
 * @author Bruno Cesar Fernandes 2013498/7
 */
public class GrupoTrabalhoDAO extends BaseDAO<GrupoTrabalhoVO> {
    
    @Override
    public void inserir(GrupoTrabalhoVO grupoTrabalho) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("INSERT INTO TB_GrupoTrabalho(NO_GrupoTrabalho, DS_GrupoTrabalho)");
        query.append("VALUES (?, ?)");

        List<?> parametros = criarParametros(grupoTrabalho.getNoGrupoTrabalho(),
                grupoTrabalho.getDsGrupoTrabalho());

        Integer idGerado = ((Long) executarInsercao(query.toString(), parametros)).intValue();

        grupoTrabalho.setIdGrupoTrabalho(idGerado);
    }
    
    @Override
    public void alterar(GrupoTrabalhoVO grupoTrabalho) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("UPDATE TB_GrupoTrabalho SET NO_GrupoTrabalho = ?,");
        query.append("DS_GrupoTrabalho = ?");
        query.append("WHERE ID_GrupoTrabalho = ?");

        List<?> parametros = criarParametros(grupoTrabalho.getNoGrupoTrabalho(), grupoTrabalho.getDsGrupoTrabalho(),
                grupoTrabalho.getIdGrupoTrabalho());

        executarAlteracao(query.toString(), parametros);
    }
    
    @Override
    public void excluir(GrupoTrabalhoVO grupoTrabalho) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("DELETE FROM TB_GrupoTrabalho");
        query.append("WHERE ID_GrupoTrabalho = ?");

        executarAlteracao(query.toString(), criarParametros(grupoTrabalho.getIdGrupoTrabalho()));
    }
    
    @Override
    public GrupoTrabalhoVO consultarPorId(Serializable id) {

        GrupoTrabalhoVO grupoTrabalho = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TB_GrupoTrabalho T WHERE T.ID_GrupoTrabalho = ?");

        grupoTrabalho = consultarUm(query.toString(), criarParametros(id));

        return grupoTrabalho;
    }
    
    @Override
    public List<GrupoTrabalhoVO> consultarPorExemplo(GrupoTrabalhoVO grupoTrabalho) {

        List<GrupoTrabalhoVO> listaRetorno = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TB_GrupoTrabalho T WHERE 1=1");

        mapearQueryParaExemplo(query, grupoTrabalho);

        listaRetorno = consultar(query.toString(), recuperarParametros());

        return listaRetorno;
    }

    public List<GrupoTrabalhoVO> consultarGruposOrdenadoPorNome() {
        ConstrutorSQL sql = new ConstrutorSQL();

        sql.append("SELECT *");
        sql.append("FROM TB_GRUPOTRABALHO A");
        sql.append("ORDER BY NO_GRUPOTRABALHO ASC");

        return consultar(sql.toString());
    }
    
    public List<GrupoTrabalhoVO> consultarPorNome(String noGrupoTrabalho) {

        List<GrupoTrabalhoVO> listaRetorno = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TB_GrupoTrabalho T WHERE NO_GrupoTrabalho=?");

        listaRetorno = consultar(query.toString(), criarParametros(noGrupoTrabalho));

        return listaRetorno;
    }    
    
    @Override
    protected GrupoTrabalhoVO extrairObjetoResultado(ResultSet rs) throws SQLException {

        GrupoTrabalhoVO grupoTrabalho = new GrupoTrabalhoVO();
        
        grupoTrabalho.setIdGrupoTrabalho(rs.getInt("ID_GrupoTrabalho"));
        grupoTrabalho.setNoGrupoTrabalho(rs.getString("NO_GrupoTrabalho"));
        grupoTrabalho.setDsGrupoTrabalho(rs.getString("DS_GrupoTrabalho"));

        return grupoTrabalho;
    }
    
        /**
     * Recupera uma lista completa de tipos ordenada pelo nome
     * 
     * @return lista de grupos
     */
    public List<GrupoTrabalhoVO> consultarTiposOrdenadoPorNome() {
        ConstrutorSQL sql = new ConstrutorSQL();
        
        sql.append("SELECT *");
        sql.append("FROM TB_GRUPOTRABALHO A");
        sql.append("ORDER BY NO_GRUPOTRABALHO ASC");
        
        return consultar(sql.toString());
    }
    
    @Override
    protected void mapearQueryParaExemplo(ConstrutorSQL query, GrupoTrabalhoVO grupoTrabalho) {

        if (grupoTrabalho.getNoGrupoTrabalho() != null && !grupoTrabalho.getNoGrupoTrabalho().isEmpty()) {
            query.append("AND T.NO_GrupoTrabalho LIKE ?");
            adicionarParametro("%" + grupoTrabalho.getNoGrupoTrabalho() + "%");
        }
        
        if (grupoTrabalho.getDsGrupoTrabalho() != null && !grupoTrabalho.getDsGrupoTrabalho().isEmpty()) {
            query.append("AND T.DS_GrupoTrabalho LIKE ?");
            adicionarParametro("%" + grupoTrabalho.getDsGrupoTrabalho() + "%");
        }      
    }    
}
